/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package converter;

import java.net.URI;
import jpa.entities.Usuario;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.XmlAttribute;
import javax.ws.rs.core.UriBuilder;
import javax.persistence.EntityManager;
import jpa.entities.UsuarioAdm;
import jpa.entities.Pedido;
import jpa.entities.UsuarioCli;
import java.util.Collection;

/**
 *
 * @author carlos
 */

@XmlRootElement(name = "usuario")
public class UsuarioConverter {
    private Usuario entity;
    private URI uri;
    private int expandLevel;
  
    /** Creates a new instance of UsuarioConverter */
    public UsuarioConverter() {
        entity = new Usuario();
    }

    /**
     * Creates a new instance of UsuarioConverter.
     *
     * @param entity associated entity
     * @param uri associated uri
     * @param expandLevel indicates the number of levels the entity graph should be expanded@param isUriExtendable indicates whether the uri can be extended
     */
    public UsuarioConverter(Usuario entity, URI uri, int expandLevel, boolean isUriExtendable) {
        this.entity = entity;
        this.uri = (isUriExtendable) ? UriBuilder.fromUri(uri).path(entity.getIdUsuario() + "/").build() : uri;
        this.expandLevel = expandLevel;
        getUsuarioCliCollection();
        getPedidoCollection();
        getUsuarioAdmCollection();
    }

    /**
     * Creates a new instance of UsuarioConverter.
     *
     * @param entity associated entity
     * @param uri associated uri
     * @param expandLevel indicates the number of levels the entity graph should be expanded
     */
    public UsuarioConverter(Usuario entity, URI uri, int expandLevel) {
        this(entity, uri, expandLevel, false);
    }

    /**
     * Getter for idUsuario.
     *
     * @return value for idUsuario
     */
    @XmlElement
    public Integer getIdUsuario() {
        return (expandLevel > 0) ? entity.getIdUsuario() : null;
    }

    /**
     * Setter for idUsuario.
     *
     * @param value the value to set
     */
    public void setIdUsuario(Integer value) {
        entity.setIdUsuario(value);
    }

    /**
     * Getter for nome.
     *
     * @return value for nome
     */
    @XmlElement
    public String getNome() {
        return (expandLevel > 0) ? entity.getNome() : null;
    }

    /**
     * Setter for nome.
     *
     * @param value the value to set
     */
    public void setNome(String value) {
        entity.setNome(value);
    }

    /**
     * Getter for email.
     *
     * @return value for email
     */
    @XmlElement
    public String getEmail() {
        return (expandLevel > 0) ? entity.getEmail() : null;
    }

    /**
     * Setter for email.
     *
     * @param value the value to set
     */
    public void setEmail(String value) {
        entity.setEmail(value);
    }

    /**
     * Getter for senha.
     *
     * @return value for senha
     */
    @XmlElement
    public String getSenha() {
        return (expandLevel > 0) ? entity.getSenha() : null;
    }

    /**
     * Setter for senha.
     *
     * @param value the value to set
     */
    public void setSenha(String value) {
        entity.setSenha(value);
    }

    /**
     * Getter for tipo.
     *
     * @return value for tipo
     */
    @XmlElement
    public Integer getTipo() {
        return (expandLevel > 0) ? entity.getTipo() : null;
    }

    /**
     * Setter for tipo.
     *
     * @param value the value to set
     */
    public void setTipo(Integer value) {
        entity.setTipo(value);
    }

    /**
     * Getter for usuarioCliCollection.
     *
     * @return value for usuarioCliCollection
     */
    @XmlElement
    public UsuarioClisConverter getUsuarioCliCollection() {
        if (expandLevel > 0) {
            if (entity.getUsuarioCliCollection() != null) {
                return new UsuarioClisConverter(entity.getUsuarioCliCollection(), uri.resolve("usuarioCliCollection/"), expandLevel - 1);
            }
        }
        return null;
    }

    /**
     * Setter for usuarioCliCollection.
     *
     * @param value the value to set
     */
    public void setUsuarioCliCollection(UsuarioClisConverter value) {
        entity.setUsuarioCliCollection((value != null) ? value.getEntities() : null);
    }

    /**
     * Getter for pedidoCollection.
     *
     * @return value for pedidoCollection
     */
    @XmlElement
    public PedidoesConverter getPedidoCollection() {
        if (expandLevel > 0) {
            if (entity.getPedidoCollection() != null) {
                return new PedidoesConverter(entity.getPedidoCollection(), uri.resolve("pedidoCollection/"), expandLevel - 1);
            }
        }
        return null;
    }

    /**
     * Setter for pedidoCollection.
     *
     * @param value the value to set
     */
    public void setPedidoCollection(PedidoesConverter value) {
        entity.setPedidoCollection((value != null) ? value.getEntities() : null);
    }

    /**
     * Getter for usuarioAdmCollection.
     *
     * @return value for usuarioAdmCollection
     */
    @XmlElement
    public UsuarioAdmsConverter getUsuarioAdmCollection() {
        if (expandLevel > 0) {
            if (entity.getUsuarioAdmCollection() != null) {
                return new UsuarioAdmsConverter(entity.getUsuarioAdmCollection(), uri.resolve("usuarioAdmCollection/"), expandLevel - 1);
            }
        }
        return null;
    }

    /**
     * Setter for usuarioAdmCollection.
     *
     * @param value the value to set
     */
    public void setUsuarioAdmCollection(UsuarioAdmsConverter value) {
        entity.setUsuarioAdmCollection((value != null) ? value.getEntities() : null);
    }

    /**
     * Returns the URI associated with this converter.
     *
     * @return the uri
     */
    @XmlAttribute
    public URI getUri() {
        return uri;
    }

    /**
     * Sets the URI for this reference converter.
     *
     */
    public void setUri(URI uri) {
        this.uri = uri;
    }

    /**
     * Returns the Usuario entity.
     *
     * @return an entity
     */
    @XmlTransient
    public Usuario getEntity() {
        if (entity.getIdUsuario() == null) {
            UsuarioConverter converter = UriResolver.getInstance().resolve(UsuarioConverter.class, uri);
            if (converter != null) {
                entity = converter.getEntity();
            }
        }
        return entity;
    }

    /**
     * Returns the resolved Usuario entity.
     *
     * @return an resolved entity
     */
    public Usuario resolveEntity(EntityManager em) {
        Collection<UsuarioCli> usuarioCliCollection = entity.getUsuarioCliCollection();
        Collection<UsuarioCli> newusuarioCliCollection = new java.util.ArrayList<UsuarioCli>();
        if (usuarioCliCollection != null) {
            for (UsuarioCli item : usuarioCliCollection) {
                newusuarioCliCollection.add(em.getReference(UsuarioCli.class, item.getIdCli()));
            }
        }
        entity.setUsuarioCliCollection(newusuarioCliCollection);
        Collection<Pedido> pedidoCollection = entity.getPedidoCollection();
        Collection<Pedido> newpedidoCollection = new java.util.ArrayList<Pedido>();
        if (pedidoCollection != null) {
            for (Pedido item : pedidoCollection) {
                newpedidoCollection.add(em.getReference(Pedido.class, item.getIdPedido()));
            }
        }
        entity.setPedidoCollection(newpedidoCollection);
        Collection<UsuarioAdm> usuarioAdmCollection = entity.getUsuarioAdmCollection();
        Collection<UsuarioAdm> newusuarioAdmCollection = new java.util.ArrayList<UsuarioAdm>();
        if (usuarioAdmCollection != null) {
            for (UsuarioAdm item : usuarioAdmCollection) {
                newusuarioAdmCollection.add(em.getReference(UsuarioAdm.class, item.getIdAdm()));
            }
        }
        entity.setUsuarioAdmCollection(newusuarioAdmCollection);
        return entity;
    }
}
